home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / gnu / glibc108.gz / glibc108 / glibc-1.08.1 / sysdeps / sparc / sparc8 / udiv_qrnnd.S < prev   
Text File  |  1994-05-16  |  4KB  |  187 lines

  1. ! SPARC  __udiv_qrnnd division support, used from longlong.h.
  2.  
  3. ! Copyright (C) 1993, 1994 Free Software Foundation, Inc.
  4.  
  5. ! This file is part of the GNU MP Library.
  6.  
  7. ! The GNU MP Library is free software; you can redistribute it and/or modify
  8. ! it under the terms of the GNU Library General Public License as published by
  9. ! the Free Software Foundation; either version 2 of the License, or (at your
  10. ! option) any later version.
  11.  
  12. ! The GNU MP Library is distributed in the hope that it will be useful, but
  13. ! WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  14. ! or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
  15. ! License for more details.
  16.  
  17. ! You should have received a copy of the GNU Library General Public License
  18. ! along with the GNU MP Library; see the file COPYING.LIB.  If not, write to
  19. ! the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20.  
  21.  
  22. ! INPUT PARAMETERS
  23. ! rem_ptr    o0
  24. ! n1        o1
  25. ! n0        o2
  26. ! d        o3
  27.  
  28. #include "sysdep.h"
  29.  
  30.     .text
  31.     .align 4
  32.     .global    C_SYMBOL_NAME(__udiv_qrnnd)
  33. C_SYMBOL_NAME(__udiv_qrnnd):
  34.     tst    %o3
  35.     bneg    Largedivisor
  36.     mov    8,%g1
  37.  
  38.     b    Lp1
  39.     addxcc    %o2,%o2,%o2
  40.  
  41. Lplop:    bcc    Ln1
  42.     addxcc    %o2,%o2,%o2
  43. Lp1:    addx    %o1,%o1,%o1
  44.     subcc    %o1,%o3,%o4
  45.     bcc    Ln2
  46.     addxcc    %o2,%o2,%o2
  47. Lp2:    addx    %o1,%o1,%o1
  48.     subcc    %o1,%o3,%o4
  49.     bcc    Ln3
  50.     addxcc    %o2,%o2,%o2
  51. Lp3:    addx    %o1,%o1,%o1
  52.     subcc    %o1,%o3,%o4
  53.     bcc    Ln4
  54.     addxcc    %o2,%o2,%o2
  55. Lp4:    addx    %o1,%o1,%o1
  56.     addcc    %g1,-1,%g1
  57.     bne    Lplop
  58.     subcc    %o1,%o3,%o4
  59.     bcc    Ln5
  60.     addxcc    %o2,%o2,%o2
  61. Lp5:    st    %o1,[%o0]
  62.     retl
  63.     xnor    %g0,%o2,%o0
  64.  
  65. Lnlop:    bcc    Lp1
  66.     addxcc    %o2,%o2,%o2
  67. Ln1:    addx    %o4,%o4,%o4
  68.     subcc    %o4,%o3,%o1
  69.     bcc    Lp2
  70.     addxcc    %o2,%o2,%o2
  71. Ln2:    addx    %o4,%o4,%o4
  72.     subcc    %o4,%o3,%o1
  73.     bcc    Lp3
  74.     addxcc    %o2,%o2,%o2
  75. Ln3:    addx    %o4,%o4,%o4
  76.     subcc    %o4,%o3,%o1
  77.     bcc    Lp4
  78.     addxcc    %o2,%o2,%o2
  79. Ln4:    addx    %o4,%o4,%o4
  80.     addcc    %g1,-1,%g1
  81.     bne    Lnlop
  82.     subcc    %o4,%o3,%o1
  83.     bcc    Lp5
  84.     addxcc    %o2,%o2,%o2
  85. Ln5:    st    %o4,[%o0]
  86.     retl
  87.     xnor    %g0,%o2,%o0
  88.  
  89. Largedivisor:
  90.     and    %o2,1,%o5    ! %o5 = n0 & 1
  91.  
  92.     srl    %o2,1,%o2
  93.     sll    %o1,31,%g2
  94.     or    %g2,%o2,%o2    ! %o2 = lo(n1n0 >> 1)
  95.     srl    %o1,1,%o1    ! %o1 = hi(n1n0 >> 1)
  96.  
  97.     and    %o3,1,%g2
  98.     srl    %o3,1,%g3    ! %g3 = floor(d / 2)
  99.     add    %g3,%g2,%g3    ! %g3 = ceil(d / 2)
  100.  
  101.     b    LLp1
  102.     addxcc    %o2,%o2,%o2
  103.  
  104. LLplop:    bcc    LLn1
  105.     addxcc    %o2,%o2,%o2
  106. LLp1:    addx    %o1,%o1,%o1
  107.     subcc    %o1,%g3,%o4
  108.     bcc    LLn2
  109.     addxcc    %o2,%o2,%o2
  110. LLp2:    addx    %o1,%o1,%o1
  111.     subcc    %o1,%g3,%o4
  112.     bcc    LLn3
  113.     addxcc    %o2,%o2,%o2
  114. LLp3:    addx    %o1,%o1,%o1
  115.     subcc    %o1,%g3,%o4
  116.     bcc    LLn4
  117.     addxcc    %o2,%o2,%o2
  118. LLp4:    addx    %o1,%o1,%o1
  119.     addcc    %g1,-1,%g1
  120.     bne    LLplop
  121.     subcc    %o1,%g3,%o4
  122.     bcc    LLn5
  123.     addxcc    %o2,%o2,%o2
  124. LLp5:    add    %o1,%o1,%o1    ! << 1
  125.     tst    %g2
  126.     bne    Oddp
  127.     add    %o5,%o1,%o1
  128.     st    %o1,[%o0]
  129.     retl
  130.     xnor    %g0,%o2,%o0
  131.  
  132. LLnlop:    bcc    LLp1
  133.     addxcc    %o2,%o2,%o2
  134. LLn1:    addx    %o4,%o4,%o4
  135.     subcc    %o4,%g3,%o1
  136.     bcc    LLp2
  137.     addxcc    %o2,%o2,%o2
  138. LLn2:    addx    %o4,%o4,%o4
  139.     subcc    %o4,%g3,%o1
  140.     bcc    LLp3
  141.     addxcc    %o2,%o2,%o2
  142. LLn3:    addx    %o4,%o4,%o4
  143.     subcc    %o4,%g3,%o1
  144.     bcc    LLp4
  145.     addxcc    %o2,%o2,%o2
  146. LLn4:    addx    %o4,%o4,%o4
  147.     addcc    %g1,-1,%g1
  148.     bne    LLnlop
  149.     subcc    %o4,%g3,%o1
  150.     bcc    LLp5
  151.     addxcc    %o2,%o2,%o2
  152. LLn5:    add    %o4,%o4,%o4    ! << 1
  153.     tst    %g2
  154.     bne    Oddn
  155.     add    %o5,%o4,%o4
  156.     st    %o4,[%o0]
  157.     retl
  158.     xnor    %g0,%o2,%o0
  159.  
  160. Oddp:    xnor    %g0,%o2,%o2
  161.     ! q' in %o2. r' in %o1
  162.     addcc    %o1,%o2,%o1
  163.     bcc    LLp6
  164.     addx    %o2,0,%o2
  165.     sub    %o1,%o3,%o1
  166. LLp6:    subcc    %o1,%o3,%g0
  167.     bcs    LLp7
  168.     subx    %o2,-1,%o2
  169.     sub    %o1,%o3,%o1
  170. LLp7:    st    %o1,[%o0]
  171.     retl
  172.     mov    %o2,%o0
  173.  
  174. Oddn:    xnor    %g0,%o2,%o2
  175.     ! q' in %o2. r' in %o4
  176.     addcc    %o4,%o2,%o4
  177.     bcc    LLn6
  178.     addx    %o2,0,%o2
  179.     sub    %o4,%o3,%o4
  180. LLn6:    subcc    %o4,%o3,%g0
  181.     bcs    LLn7
  182.     subx    %o2,-1,%o2
  183.     sub    %o4,%o3,%o4
  184. LLn7:    st    %o4,[%o0]
  185.     retl
  186.     mov    %o2,%o0
  187.